#include <emscripten.h>   // Emscripten核心库
#include <cmath>          // 数学函数
#include <cstring>        // 字符串操作
#include <cstdlib>        // 内存管理

// ==================== 基本数学运算 ====================
extern "C" {
    // 加法函数（EMSCRIPTEN_KEEPALIVE确保函数被导出）
    EMSCRIPTEN_KEEPALIVE
    int add(int a, int b) {
        return a + b;
    }
    
    // 计算平方根（浮点数示例）
    EMSCRIPTEN_KEEPALIVE
    float sqrtf(float value) {
        if (value < 0) return NAN; // 处理负数情况
        return std::sqrt(value);
    }
}

// ==================== 字符串操作 ====================
extern "C" {
    // 拼接两个字符串（返回新字符串指针）
    EMSCRIPTEN_KEEPALIVE
    char* concat(const char* str1, const char* str2) {
        size_t len1 = strlen(str1);
        size_t len2 = strlen(str2);
        char* result = (char*)malloc(len1 + len2 + 1); // +1 for null terminator
        
        if (result) {
            strcpy(result, str1);
            strcat(result, str2);
        }
        return result; // 调用方需释放内存
    }
    
    // 释放字符串内存
    EMSCRIPTEN_KEEPALIVE
    void free_string(char* str) {
        free(str);
    }
}

// ==================== 数组处理 ====================
extern "C" {
    // 对浮点数组进行缩放操作（原地修改）
    EMSCRIPTEN_KEEPALIVE
    void scale_array(float* array, int length, float factor) {
        for (int i = 0; i < length; ++i) {
            array[i] *= factor;
        }
    }
    
    // 计算数组平均值
    EMSCRIPTEN_KEEPALIVE
    float array_average(const float* array, int length) {
        if (length <= 0) return 0.0f;
        
        float sum = 0.0f;
        for (int i = 0; i < length; ++i) {
            sum += array[i];
        }
        return sum / length;
    }
}

// ==================== 复杂数据结构 ====================
struct Vector2D {
    float x;
    float y;
};

extern "C" {
    // 计算两点距离
    EMSCRIPTEN_KEEPALIVE
    float distance(Vector2D a, Vector2D b) {
        float dx = b.x - a.x;
        float dy = b.y - a.y;
        return std::sqrt(dx*dx + dy*dy);
    }
    
    // 向量标准化（修改原始向量）
    EMSCRIPTEN_KEEPALIVE
    void normalize(Vector2D* vec) {
        float length = std::sqrt(vec->x*vec->x + vec->y*vec->y);
        if (length > 0.0001f) {
            vec->x /= length;
            vec->y /= length;
        }
    }
}